package poo.giochi;

public class GiocoDellaVita {
	private char[][] mappa, nuovaMappa;

	public GiocoDellaVita(int n, int m) {
		if (n <= 0 || m <= 0)
			throw new IllegalArgumentException();
		mappa = new char[n][m];
		nuovaMappa = new char[n][m];
		for (int i = 0; i < n; i++)
			for (int j = 0; j < m; j++)
				mappa[i][j] = '.';
	}// GiocoDellaVita

	public void aggiungiOrganismo(int i, int j) {
		if (i < 0 || i >= mappa.length || j < 0 || j >= mappa[0].length)
			throw new IllegalArgumentException();
		mappa[i][j] = '*';
	}// aggiungiOrganismo

	public void aggiungiOrganismo() {
		boolean inserito = false;
		do {
			int i = (int) (Math.round(Math.random() * (mappa.length - 1)));
			int j = (int) (Math.round(Math.random() * (mappa[0].length - 1)));
			if (mappa[i][j] == '.') {
				mappa[i][j] = '*';
				inserito = true;
			}
		} while (!inserito);
	}// aggiungiOrganismo

	public void prossimaGenerazione() {
		for (int i = 0; i < mappa.length; i++)
			for (int j = 0; j < mappa[i].length; j++) {
				int conta = vicini(i, j);
				if (mappa[i][j] == '*') {
					if (conta == 2 || conta == 3)
						nuovaMappa[i][j] = '*';
					else
						nuovaMappa[i][j] = '.';
				} else if (conta == 3)
					nuovaMappa[i][j] = '*';
				else
					nuovaMappa[i][j] = '.';
			}
		char[][] tmp = mappa;
		mappa = nuovaMappa;
		nuovaMappa = tmp;
	}// prossimaGenerazione

	private int vicini(int i, int j) {
		int conta = 0;
		if (i > 0 && mappa[i - 1][j] == '*')// NORD
			conta++;
		if (i > 0 && j < mappa[i].length - 1 && mappa[i - 1][j + 1] == '*')// NORDEST
			conta++;
		if (j < mappa[i].length - 1 && mappa[i][j + 1] == '*')// EST
			conta++;
		if (i < mappa.length - 1 && j < mappa[i].length - 1
				&& mappa[i + 1][j + 1] == '*')// SUDEST
			conta++;
		if (i < mappa.length - 1 && mappa[i + 1][j] == '*')// SUD
			conta++;
		if (i < mappa.length - 1 && j > 0 && mappa[i + 1][j - 1] == '*')// SUDOVEST
			conta++;
		if (j > 0 && mappa[i][j - 1] == '*')// OVEST
			conta++;
		if (i > 0 && j > 0 && mappa[i - 1][j - 1] == '*')// NORDOVEST
			conta++;

		return conta;
	}

	public String toString() {
		String s = "";
		for (int i = 0; i < mappa.length; i++) {
			for (int j = 0; j < mappa[0].length; j++)
				s = s + mappa[i][j];
			s += "\n";
		}
		return s;
	}
}
